//整个应用
const http = require('http');

//用户不能直接修改context, request, response
const context = require('./context');
const request = require('./request');
const response = require('./response');

class Application{
    constructor() {
/*
this.context = Object.create(context); 这一行创建了一个新的对象，并将其链接到context对象。这意味着this.context对象将继承context对象的所有可枚举和可配置的属性和方法。

this.request = Object.create(request); 同样地，这里创建了一个新的对象，其原型链接到了request对象，使this.request能够继承request的属性和方法。

this.response = Object.create(response); 这一行创建了一个新的对象，其原型链接到了response对象，使this.response能够继承response的属性和方法。
*/

        //this.context.__proto__ = context
        this.context = Object.create(context);
        this.request = Object.create(request);
        this.response = Object.create(response);
    }

    use(fn){
        this.fn = fn;
    }

    createContext(req,res){
        //
        const ctx = Object.create(this.context);
        const request = Object.create(this.request);
        const response = Object.create(this.response);

        ctx.req = req;           //原生的
        ctx.request = request;   //自己封装的
        ctx.request.req = req;   //原生的

        ctx.res = res;           //原生的
        ctx.response = response;   //自己封装的
        ctx.response.res = res;   //原生的

        return ctx;
    }

    handleRequest = (req,res) => {
        // console.log(this);

        const ctx = this.createContext(req,res);
        this.fn(ctx);
        }

    listen(){
        const server = http.createServer(this.handleRequest);
        server.listen(...arguments); 
    }
}

module.exports = Application;